// 封装购物车模块
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
// 在cartStore中使用userStore
import { useUserStore } from './user'
import { insertCartAPI, findNewCartListAPI, delCartAPI } from '@/apis/cart'

export const useCartStore = defineStore('cart', () => {
    const userStore = useUserStore()
    const isLogin = computed(() => userStore.userInfo.token)

    // 定义state
    const cartList = ref([])

    // 定义action
    // 加入购物车
    const addCart = async (good) => {
        // console.log('加入购物车action执行')
        if (isLogin) {
            // 登录之后的加入购物车逻辑
            const { skuId, count } = good
            await insertCartAPI({ skuId, count })
            updateNewCartList()
        } else {
            // 本地购物车添加入购物车逻辑
            // 已添加过：count + 1
            // 没有添加过：直接push
            // 思路：通过匹配传递过来的商品对象中的skuId能不能在cartList中找到，找到了就是添加过
            const item = cartList.value.find((item) => good.skuId === item.skuId)
            if (item) {
                // 找到啦
                item.count++
            } else {
                // 没找到
                cartList.value.push(good)
            }
        }
    }

    // 删除购物车
    const delCart = async (skuId) => {
        // console.log('删除购物车action执行')
        if (isLogin) {
            await delCartAPI([skuId])
            // 获取最新购物车
            updateNewCartList()
        } else {

            // 方法一：找到要删除项的下标值 splice
            // 方法二：使用数组的过滤方法 filter
            const idx = cartList.value.findIndex((item) => item.skuId === skuId)
            cartList.value.splice(idx, 1)
        }
    }

    // 清除购物车
    const clearCart = () => {
        cartList.value = []
    }

    // 获取最新购物车列表
    const updateNewCartList = async (good) => {
        const res = await findNewCartListAPI()
        cartList.value = res.result
    }


    // 单选功能
    const singleCheck = (skuId, selected) => {
        // 根据skuId找到要修改的项，修改其selected
        const item = cartList.value.find((item) => item.skuId === skuId)
        item.selected = selected
    };

    // 全选功能
    const allCheck = (selected) => {
        // 把cartList中所有项的selected都设置为当前的全选框状态
        cartList.value.forEach(item => item.selected = selected)
    };

    // getters 计算属性
    // 1.总数量 所有项的 count 之和
    const allCount = computed(() => {
        return cartList.value.reduce((x, y) => x + y.count, 0)
    })
    // 2.总价格 所有项的 count * price
    const allPrice = computed(() => {
        return cartList.value.reduce((x, y) => x + y.count * y.price, 0)
    })

    // 3.选中数量
    const selectedCount = computed(() => {
        return cartList.value
            .filter(item => item.selected)
            .reduce((x, y) => x + y.count, 0)
    })
    // 4.选中商品总价格
    const selectedPrice = computed(() => {
        return cartList.value
            .filter(item => item.selected)
            .reduce((x, y) => x + y.count * y.price, 0)
    })

    // 是否全选
    const isAll = computed(() => {
        return cartList.value.every((item) => item.selected)
    })

    return {
        cartList, allCount, allPrice, isAll, selectedCount, selectedPrice,
        addCart, delCart, singleCheck, allCheck, clearCart, updateNewCartList
    }
},
    {
        persist: true   // store持久化配置
    }
)